---
id: 集群和负载均衡
sidebar_position: 2.6
description: nginx通过反向代理实现集群和负载均衡
---

## Nginx配置集群
集群就是一组全部是一摸一样的服务构成的，负载均衡就是通过反向代理将请求按照策略分配到集群中的每一台服务器上，从而实现服务高可用、提高并发量。

反向代理的关键字  proxy_pass， 可以反向代理到一台服务器，也可以反向代理到一组服务器（集群），反向代理到服务器集群，就叫做负载均衡。

反向代理到多台服务器，必须使用 upstream 指令块，指定集群信息。

upstream 指令块中如果只配置了一台 server，则只有反向代理的作用，没有负载均衡。

```conf
# 配置上游服务器
upstream    tomcats {
    server    tomcat1:8080;
    server    tomcat2:8080;
    server    tomcat3:8080;
}

server    {
    listen    80;
    server_name    localhost;
    location / {
        proxy_pass    http://tomcats;
    }
}
```

:::tip
Nginx是高性能的Http和反向代理 Web 服务器。通过反向代理实现集群和负载均衡，反向代理的关键字是 proxy_pass。<br/>
:::

## Nginx 集群负载均衡
负载均衡指的是集群之间的负载均衡，先有集群才会有负载均衡。

<figure>
    <img src={require('./img/nginx集群负载均衡.png').default}/>
    <center><figcaption>nginx集群负载均衡</figcaption></center>
</figure>

上面配置文件中配置了3台tomcat集群，默认就实现了集群负载均衡，本身就带有默认的负载均衡策略————轮询。
### 负载均衡状态
#### 轮询
针对服务器硬件配置一模一样的、集群中的服务不需要维持用户会话的情况。
#### 加权轮询
针对服务器硬件配置不一样的情况，集群中的服务不需要维持用户会话的情况。
```conf
upstream tomcats {
        server 192.168.1.173:8080 weight=6;
#       server 192.168.1.190:8080;
        server 192.168.1.174:8080 weight=2;
        server 192.168.1.175:8080 weight=2;
}

```
#### ip_hash
ip_hash 可以保证用户访问可以请求到上游服务中的固定的服务器，前提是用户ip没有发生更改。
使用ip_hash的注意点：
不能把后台服务器直接移除，只能标记down

用于应对需要维持用户会话的情况，不常用。
```conf
upstream tomcats {
        ip_hash;

        server 192.168.1.173:8080;
        server 192.168.1.174:8080 down;
        server 192.168.1.175:8080;
}
```
#### url_hash 与 least_conn
根据每次请求的 url 请求，hash 后访问到固定的服务器节点。
```conf
upstream tomcats {
    # url hash
    hash $request_uri;
    # 最少连接数
    # least_conn

    server 192.168.1.173:8080;
    server 192.168.1.174:8080;
    server 192.168.1.175:8080;
}


server {
    listen 80;
    server_name www.tomcats.com;

    location / {
        proxy_pass  http://tomcats;
    }
}
```
## upstream 指令参数
### max_conns
限制每台 server 的连接数，用于保护避免过载，可起到限流作用，
```conf
# worker进程设置1个，便于测试观察成功的连接数
worker_processes  1;

upstream tomcats {
        server 192.168.1.173:8080 max_conns=2;
        server 192.168.1.174:8080 max_conns=2;
        server 192.168.1.175:8080 max_conns=2;
}
```
### slow_start
```conf
upstream tomcats {
        server 192.168.1.173:8080 weight=6 slow_start=60s;
#       server 192.168.1.190:8080;
        server 192.168.1.174:8080 weight=2;
        server 192.168.1.175:8080 weight=2;
}
```
**注意**
* 该参数不能使用在 hash 和 random load balancing。
* 如果 upstream 中只有一台 server ，则该参数失效。
### upstream 指令参数 down、backup
down 用于标记服务节点不可用，backup表示当前服务器节点是备用机，只有在其他的服务器都宕机以后，自己才会加入到集群中，被用户访问到：
```conf
upstream tomcats {
        server 192.168.1.173:8080 backup;
#       server 192.168.1.190:8080;
        server 192.168.1.174:8080 weight=1;
        server 192.168.1.175:8080 weight=1 down;
}
```
**注意**<br/>
* backup参数不能使用在hash和random load balancing中。<br/>
### upstream 指令参数max_fails、fail_timeout
max_fails：表示失败几次，则标记server已经宕机，剔除上游服务。<br/>
fail_timeout：表示失败的重试时间。<br/>
假设目前设置如下：<br/>
```conf
max_fails=2 fail_timeout=15s
```
则代表在 15 秒内请求某一server失败达到2次后，则认为该server已经挂了或者已经宕机了，随后再过15秒，这15秒后不会有新的请求到达刚刚挂掉的节点上，
而是会请求到正常运作的server，15秒后会再有新请求尝试连接挂掉的server,如果还是失败，重复上一过程，直到恢复。
### keepalive 提高吞吐量
* keepalived：设置长连接处理的数量
* proxy_http_version：设置长连接http版本为1.1
* proxy_http_header：清楚connection header信息
```conf
upstream tomcats {
#       server 192.168.1.173:8080 max_fails=2 fail_timeout=1s;
        server 192.168.1.190:8080;
#       server 192.168.1.174:8080 weight=1;
#       server 192.168.1.175:8080 weight=1;
        keepalive 32;
}

server {
        listen       80;
        server_name  www.tomcats.com;

        location / {
            proxy_pass  http://tomcats;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
```
